数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


最小费用流问题

在实际问题中,我们总是希望在完成运输任务的同时,寻求运输费用最低的方案。最小费用流问题,就是要以最小费用从出发点(供应点)将一定的流量输送到接收点(需求点)。在最小流问题中,供应点、需求点的数量可以是一个或多个,但每个供应点的供应量和需求点的需求量是固定的。

最小费用流问题可以用如下的线性规划问题描述

$$ \begin{aligned} &{\min \quad \sum_{i=1}^m\sum_{j=1}^m w_{ij}f_{ij}} \\ s.t.&\left\{\begin{array}{ll} {\displaystyle\sum_{j=1}^{m}f_{ij} -\sum_{j=1}^m f_{ji} = v_i, i=1,2,...,m} \\ {\sum_{i=1}^m v_i=0, i=1,2,...,m} \\ {0\le f_{ij} \le c_{ij}, i=1,2,...,m, j=1,2,...,m} \end{array}\right. \end{aligned} $$

求解算法

求解最小费用流问题的方法很多,常见的如:连续最短路算法(Successive shortest path)、消圈算法(Cycle canceling)、原始对偶算法(Primal dual)、网络单纯性算法(Network simplex)和非均衡网络流算法(Out of Kilter法)等。

网络单纯形是单纯形算法的一个特殊应用,它使用生成树基来更有效地解决具有纯网络形式的线性规划问题。网络单纯性为最小费用流问题提供了标准的解决方法,可以解决数万个节点的大型问题。

最小费用流问题最重要的应用是配送网络的优化,如确定如何从出发地运送到中转站再转运到客户的配送方案。运输问题、指派问题、转运问题、最大流问题、最短路径问题,都是特殊情况下的最小费用流问题。例如,最短路径问题是流量 v=1 的最小费用流问题,最大流问题是最大流量下的最小费用流问题。只要选定合适的权重、容量、流量,解决最小费用流的方法就能用来解决上述问题。

案例

下表表示了两点之间的费用矩阵:

a b c d e f g h i j
a 0 3 5 7 0 1 0 0 0 0
b 0 0 0 0 0 0 0 9 6 2
c 0 0 0 3 0 2 0 0 1 0
d 0 0 0 0 3 0 6 4 0 0
e 0 1 0 0 0 0 0 0 4 6
f 0 0 0 0 0 0 0 4 0 0
g 0 0 0 0 7 0 0 0 0 0
h 0 0 0 0 0 0 1 0 1 3
i 0 0 0 0 0 0 0 0 0 3
j 0 0 0 0 0 0 0 0 0 0

另一张表表示两点之间的容量矩阵:

a b c d e f g h i j
a 0 6 8 3 0 3 0 0 0 0
b 0 0 0 0 0 0 0 7 10 5
c 0 0 0 4 0 4 0 0 3 0
d 0 0 0 0 3 0 6 4 0 0
e 0 7 0 0 0 0 0 0 3 4
f 0 0 0 0 0 0 0 4 0 0
g 0 0 0 0 7 0 0 0 0 0
h 0 0 0 0 0 0 1 0 3 1
i 0 0 0 0 0 0 0 0 0 3
j 0 0 0 0 0 0 0 0 0 0

我们可以利用NetworkX中的min_cost_flow_cost 进行求解得到下图: